/*
 * ﻿Copyright (C) 2009-2013 NewMain Softech
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package com.newmainsoftech.gwetons.shared.logging;


/**
 * Convenient abstract class to utilize logging via {@link LoggerWrap} framework. <br /> 
 * When sub-class does not have static method for logging, then extend from this, and obtain 
 * {@link LoggerWrap} instance for logging via {@link #getLoggerWrap()} method.  
 * For the class with static method, use getLoggerWrap methods of {@link LoggerWrapFactoryImpl} class instead.
 * 
 * @author <a href="mailto:artymt@gmail.com">Arata Y.</a>
 */
public abstract class LoggerWrapAdapterTemplate {
	// For logging --------------------------------------------------------------------------------
	abstract protected String getNameForLogging();
	
	protected final Object loggerWrapLock = new Object();
	
	private LoggerWrapFactory loggerWrapFactory;
		/**
		 * @return {@link LoggerWrapFactory} object held by {@link #loggerWrapFactory} member 
		 * field. 
		 */
		protected LoggerWrapFactory getLoggerWrapFactory() {
			synchronized( loggerWrapLock) {
				return loggerWrapFactory;
			} // synchronized
		}
		protected void setLoggerWrapFactory( LoggerWrapFactory loggerWrapFactory) {
			synchronized( loggerWrapLock) {
				this.loggerWrapFactory = loggerWrapFactory;
				setLoggerWrap( null);
			} // synchronized
		}
	
	private LoggerWrap loggerWrap;
		/**
		 * @return {@link LoggerWrap} object held by {@link #loggerWrap} member field. <br />
		 * If <code>loggerWrap</code> member field value is null when this method is called, then it will 
		 * be obtained via {@link LoggerWrapFactoryImpl#getLoggerWrap(String, LoggerWrapFactory)} method. 
		 */
		protected LoggerWrap getLoggerWrap() {
			synchronized( loggerWrapLock) {
				if ( loggerWrap == null) {
					setLoggerWrap( 
							LoggerWrapFactoryImpl.getLoggerWrap( 
									getNameForLogging(), 
									getLoggerWrapFactory()
									)
							);
				}
				return loggerWrap;
			} // synchronized
		}
		protected void setLoggerWrap( LoggerWrap loggerWrap) {
			synchronized( loggerWrapLock) {
				this.loggerWrap = loggerWrap;
			} // synchronized
		}
	// --------------------------------------------------------------------------------------------
}
